======================================================================================
================================== LEXICAL GRAMMAR ===================================
======================================================================================
letter     -> [A-Za-z]
digit      -> [0-9]
identifier -> letter ( letter | digit )*
digits     -> digit+
number     -> digits(.digits)?
keyWords   -> void | int | double | boolean | if | else | while | return | break | continue | println | false | true
token      -> identifier | number | ; | ( | ) | { | } | = | * | / | + | - | == | != | < | <= | > | >= | , | keyWords | eot

separator  -> # graphic* eol | space | eol | tab
======================================================================================
================================= SYNTACTIC GRAMMAR ==================================
======================================================================================
Program -> (Type identifier (; | ( (Parameters | empty) )) { FunctionBody })* eot
Type -> void | int | double | boolean - OK
Parameters -> Type identifier (empty | , Parameters) - OK
FunctionBody -> (Type identifier ;)* Statements - OK
Statements -> Statement* - OK
Statement -> identifier (( (Arguments | empty) ) | = RHS) ; | if ( Expression ) { Statements } (empty | else { Statements }) | while ( Expression ) { Statements } | return Expression ; | return ; | break ; | continue ; | println ( identifier ) ; - OK  
Arguments -> identifier (empty | , Arguments) - OK
RHS -> ( Expression ) | identifier ( (Arguments | empty) ) - OK
Expression -> ( Expression ( + | - | * | / | == | != | > | >= | < | <= ) Expression ) | Value - OK  
Value -> identifier | number | false | true - OK
======================================================================================
=================================== AST STRUCTURE ====================================
======================================================================================
Program = Command*
Command = VariableDeclaration | FunctionDeclaration
	VariableDeclaration = Type Identifier
	FunctionDeclaration = Type Identifier VariableDeclaration* FunctionBody
	FunctionBody = VariableDeclaration* Statement*
Statement = CallStatement | AssignStatement | IfStatement | WhileStatement | ReturnStatement | BreakStatement | ContinueStatement | PrintlnStatement
	AssignStatement = Identifier RHS
	BreakStatement = 
	CallStatement = Identifier Identifier*
	ContinueStatement = 
	IfElseStatement = Expression Statement* Statement* - OK
	PrintlnStatement = Identifier
	ReturnStatement = Expression
	WhileStatement = Expression Statement*
RHS = ExpressionRHS | CallStatementRHS
	ExpressionRHS = Expression
	CallStatementRHS = CallStatement
Expression = BinaryExpression | UnaryExpression
	BinaryExpression = Expression Operator Expression
	UnaryExpression = IdentifierUnaryExpression | NumberUnaryExpression | BooleanUnaryExpression
	IdentifierUnaryExpression = Identifier
	NumberUnaryExpression = Number
	BooleanUnaryExpression = Boolean
Terminal = Type | Identifier | Operator | Number | Boolean  
======================================================================================
======================================================================================
======================================================================================